import os
import uuid

# 获取项目根路径
project_root = os.path.dirname(os.path.abspath(__file__))

# jwt_config
jwt_config = {
    "secret_key": "sk-75e895e445cf8fbe257f17cb0443ff9762",
    "algorithm": "HS256",
    "expire_minutes": 300
}

# uuid5 命名空间
namespace = uuid.UUID("6ba7b814-9dad-11d1-80b4-00c04fd430c8")



#####################one api####################
# model
model = {
    "api_key": "sk-QUFEmHUpvObHH7wm10Eb6b5fB53e43F2Aa8673A7Ae9c98F0",
    "api_base": "http://192.168.0.108:3032/v1",
    "backend_token": "aee8dd75bb73441bb0e8636a529e6bb3",
    "backend_url": "http://192.168.0.108:3032/api/channel",
    "minicpm": "/oneapi/proxy/5/rerank",
}
# 默认embed
default_embed = "conan-embedding"
# 默认reranker
default_reranker = "minicpm"

# 厂商下模型列表通过/api/models获取
MODEL_OPTIONS = {
    "1": "OpenAI",
    "14": "Anthropic Claude",
    "33": "AWS",
    "3": "Azure OpenAI",
    "11": "Google PaLM2",
    "24": "Google Gemini",
    "28": "Mistral AI",
    "41": "Novita",
    "40": "字节跳动豆包",
    "15": "百度文心千帆",
    "17": "阿里通义千问",
    "18": "讯飞星火认知",
    "16": "智谱 ChatGLM",
    "19": "360 智脑",
    "25": "Moonshot AI",
    "23": "腾讯混元",
    "26": "百川大模型",
    "27": "MiniMax",
    "29": "Groq",
    "30": "Ollama",
    "31": "零一万物",
    "32": "阶跃星辰",
    "34": "Coze",
    "35": "Cohere",
    "36": "DeepSeek",
    "37": "Cloudflare",
    "38": "DeepL",
    "39": "together.ai",
    "42": "VertexAI",
    "43": "Proxy",
    "44": "SiliconFlow",
    "45": "xAI",
    "8": "自定义渠道",
    "22": "知识库：FastGPT",
    "21": "知识库：AI Proxy",
    "20": "代理：OpenRouter",
    "2": "代理：API2D",
    "5": "代理：OpenAI-SB",
    "7": "代理：OhMyGPT",
    "10": "代理：AI Proxy",
    "4": "代理：CloseAI",
    "6": "代理：OpenAI Max",
    "9": "代理：AI.LS",
    "12": "代理：API2GPT",
    "13": "代理：AIGC2D"
}


#####################上下文分块####################
contextual_prompt = """
鉴于下面的文档，我们想解释块在文档中捕获了什么。
<document>
{WHOLE_DOCUMENT}
</document>
以下是我们想要解释的部分：
<chunk>
{CHUNK_CONTENT}
</chunk>
请提供一个简短简洁的上下文，将这个块放在整个文档中，以改善块的搜索检索。只回答简洁的上下文，不要回答其他问题。
"""


#####################cpm重排模型####################
cpm_reranker = {
    "model_path": "/data/disk1/model/rerank/bge-reranker-v2-minicpm-layerwise",
}

#####################问答prompt####################
query_prompt = """\
## Role :
你是一个值得信赖的专家问答系统。
## Goals :
1. 你会始终使用提供的上下文信息回答查询，而不是先前的知识。
2. 若没有获得提供的上下文信息，你会礼貌的说明原因并表达无法回答。
## Constrains :
1. 不要在你的回答中直接引用给定的上下文。
2. 避免使用诸如'根据上下文,…'或'上下文信息…'等类似语句。
上下文信息如下。每个上下文都以一个参考数字开头，比如[[citation:x]]，其中x是一个数字。请使用上下文，并在每句话的末尾引用上下文（如适用）。
格式为[citation:x]。如果一个句子来自多个上下文，请列出所有适用的引文，如[citation:3][citation:5]。
---------------------
{context}
---------------------
回答以下查询，注意是根据上下文信息而不是先前的知识，否则你会受到惩罚。若没有获得提供的上下文信息，你会礼貌的说明原因并表达无法回答。
查询: {query}
答案: 
"""


#####################推荐问题prompt####################
more_questions_prompt = """
你是一个智能且高效的推荐问题助手。

以下是问题的上下文信息：
--------------------
{context}
--------------------

## 工作流程
1. 逐步思考并理解问题的上下文信息，根据问题的上下文信息，生成十个不同的问答对。
2. 理解用户输入的问题，若用户问题与提供的上下文信息不相关时，只输出“无法提供相关信息”，不生成任何推荐问题。
3. 若用户问题与提供的上下文信息相关时，逐步思考并评估步骤1中生成的问答对与用户原始问题的相关度，删除生成的十个问答对中的问题与用户原始问题<相同或高度相似>的问题，比如“上海同济大学是不是联盟成员？”和“上海同济大学是联盟成员吗？”。
4. 根据步骤3中剩余问答对中的问题与用户原始问题的相关度评估结果，从剩余问答对中选择<最不相关>的三个问答对中的问题作为推荐问题。
5. 务必<直接输出>步骤4中生成的三个推荐问题，输出之前确保没有“-”、序号等多余字符。问题之间仅使用换行符分割。

以下是用户输入的问题：
--------------------
{query}
--------------------

请使用中文回答。通过<工作流程>根据用户问题和问题的上下文信息生成三个推荐问题。输出前务必确保只把最终的<三个推荐问题>提取出来，不要生产其他内容。若没有找到提供的上下文信息只输出“无法提供相关信息”，不生成任何推荐问题，否则你会受到惩罚。
"""